package zombies;

import java.util.List;
import java.util.Random;

final public class Asesino implements Runnable{

	private static final int PROBABILIDAD_MATAR_ZOMBIE = 4;
	private static final int TIEMPO_PARA_MATAR = 10;
	private static final int TIEMPO_CHEQUEAR_GALPON = 2000;
	private int cantZombies;
	private List<Amigo> amigos;
	final	private int cantidadMaximaZombies;
	private Random random;
	private Thread manoIzquierda;
	private boolean puertasCerradas =false;
	private long tiempoInicio = 0l;
	private Galpon galpon;
	
	public Asesino(int cantidadMaximaZombies, List<Amigo> amigos, Galpon galpon){
		this.amigos = amigos;
		this.cantidadMaximaZombies = cantidadMaximaZombies;
		this.random = new Random();
		this.galpon = galpon;
		manoIzquierda = new Thread (new Runnable() {
			
			@Override
			public void run() {
				try {
					chequearGalpon();
					Thread.sleep(TIEMPO_CHEQUEAR_GALPON);
					run();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				
				
			}
		});
	}

	@Override
	public void run() {
			try {
				manoIzquierda.start();
				jugar();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}		
	}
	
	private void jugar() throws InterruptedException {
		int p = random.nextInt(10);
		if(p < PROBABILIDAD_MATAR_ZOMBIE)
			asesinarZombie();
		Thread.sleep(TIEMPO_PARA_MATAR);
		jugar();
		
	}

	private void asesinarZombie(){
		int cantZombiesGalpon = getCantidadZombies() - cantZombies;//Antigua Manera
		cantZombiesGalpon = galpon.getCantidadZombies();
		if(cantZombiesGalpon > 0){
			cantZombies++;
			galpon.decrementarCuentaZombies();
			System.out.println("Asesino: He asesinado uno mas");
			System.out.println("Asesino: He asesinado en total: " + cantZombies + " zombies");
		}
	}
	
	private void chequearGalpon() throws InterruptedException{
//		System.out.println("Balance: Zombies dejados entrar: " + getCantidadZombies());
//		System.out.println("Balance: Zombies asesinados: " + cantZombies);
//		System.out.println("Balance: Zombies vivos adentro: " + (getCantidadZombies() - cantZombies));
		if(tiempoInicio == 0l){
			tiempoInicio = System.currentTimeMillis();
		}else{
			long tiempoActual = System.currentTimeMillis();
			long diffTiempos = tiempoActual - tiempoInicio;
			double tiempoEnSegundos = diffTiempos / 1000;
			double promedioMuertes =  cantZombies / tiempoEnSegundos;
			System.out.println("RESIDENTE EVIL: Promedio de muertes por segundo: " + promedioMuertes);
		}
		if(estaLlenoDeZombies())
			cerrarPuertasGalpon();
		else
			continuarMetiendoZombies();
	}
	
	private void continuarMetiendoZombies() {		
		if((getCantidadZombies() - cantZombies) <= (cantidadMaximaZombies/2)){
			if(puertasCerradas){
				puertasCerradas = false;
				System.out.println("Asesino: Suficiente espacio, continuar metiendo zombies");
				for (Amigo amigo : amigos) 
					amigo.continuarMetiendoZombies();
			}
		}
	}

	private void cerrarPuertasGalpon() throws InterruptedException {
		if(!puertasCerradas ){
			puertasCerradas = true;
			System.out.println("Asesino: Muchos zombies, que no entre uno mas");
			for (Amigo amigo : amigos)
				amigo.cerrarPuerta();		
		}
	}

	private boolean estaLlenoDeZombies(){
		int acum = getCantidadZombies();		
		return (acum - cantZombies) >= cantidadMaximaZombies;
	}

	private int getCantidadZombies() {
		int acum = 0;		
		for (Amigo amigo : amigos) 
			acum += amigo.getCantidadZombies();
		return acum;
	}
}